package com.naraba.socket.netty;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandler;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.nio.charset.Charset;
import java.util.Date;

/**
 * @auther xjl
 * @date 2020/10/30
 * @description
 **/
public class FirstClientHandler extends ChannelInboundHandlerAdapter {

    /**
     * 方法会在客户端与服务器建立连接后调用。所以我们可以在这里面编写逻辑代码
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("客户端发送消息...");
        // 1、获取数据
        ByteBuf byteBuf = getByteBuf(ctx);
        ctx.channel().writeAndFlush(byteBuf);
    }

    private ByteBuf getByteBuf(ChannelHandlerContext ctx) {
        // 1. 获取二进制抽象 ByteBuf ,的作用是把字符串的二进制数据填充到ByteBuf
        ByteBuf  buffer = ctx.alloc().buffer();
        // 2. 准备数据，指定字符串的字符集为 utf-8
        byte[] bytes = ("【客户端】:这是客户端发送的消息：" + new Date()).getBytes(Charset.forName("UTF-8"));
        // 3. 填充数据到 ByteBuf,作用是把数据写到服务器
        buffer.writeBytes(bytes);
        return buffer;
    }
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        super.channelInactive(ctx);
    }

    /**
     * 在接受到服务端的消息后调用
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf byteBuf = (ByteBuf) msg;
        // 接受服务端消息并打印
        System.out.println(byteBuf.toString(Charset.forName("utf-8")));
    }
}
